/**
 * 固定表头插件
 * @version 1.0
 * @author Ly
 * @create 2010/12/31
 */
Ly.FixedTableHeader = function() {
	var _this = this;
	
	this.config = {
		tables : []
	};
	
	this.method = {
		/**
		 * 判断arr中是否包含str
		 * @param {Array} arr 源数组
		 * @param {String} str 要测试的字符串
		 * @return {Boolean} 如果arr中包含str则返回true，否则false
		 */
		has : function(arr, str) {
			for (var i = 0, len = arr.length; i < len; ++i) {
				if (arr[i].toLowerCase() == str.toLowerCase()) {
					return true;
				}
			}
			return false;
		},
		/**
		 * 固定新创建表格的位置
		 * @param {Object} nb 新创建的表格
		 * @param {Object} ob 参照表格
		 */
		fixTablePosition : function(nb /* Object */, ob /* Object */) {
			var ntds = nb.getElementsByTagName('tr')[0].getElementsByTagName('td'),
				otds = ob.getElementsByTagName('tr')[0].getElementsByTagName('td');
			
			for (var i = 0, len = otds.length; i < len; ++i) {
				ntds[i].style.width = otds[i].clientWidth + 'px';
			}
			
			nb.style.position = 'absolute';
			nb.style.left = ob.offsetLeft + 'px';
			nb.style.top = ob.offsetTop + 'px';
			
			return this;
		},
		/**
		 * 属性复制，不同于prototype的抄写，仅仅是对HTMLElement的style进行复制
		 * @param {Object} obj 目标对象
		 * @param {Object} config 要复制的属性列表
		 * @param {Object} list 要复制的属性
		 */
		copyAttributes : function(obj /* Object */, config /* Object */, list /* Array */) {
			if (arguments.length < 2) {
				alert('缺少参数！');
				return this;
			}
			
			for (var i = 0, len = list.length; i < len; ++i) {
				if (list[i] == 'class') {
					obj.className = config.className;
				} else {
					obj[list[i]] = config[list[i]];
				}
			}
			return this;
		},
		/**
		 * 获取table的第一行，如果有theader，则取theader中的，否则取tbody
		 * @param {Object} table 要获取表头的table
		 * @return {Object} tr对象
		 */
		getHeader : function(table /* Object */) {
			var trs = table.getElementsByTagName('tr');
			
			return trs ? trs[0] : null;
		},
		/**
		 * 以table为蓝本创建一个表格骨架，并且将table的所有属性（id除外）全部复制到新创建的表格对象上
		 * @param {Object} table 要创建的表格的蓝本
		 * @param {Object} tr 要复制的行
		 */
		createTable : function(table /* Object */, tr /* Object */) {
			var nt = Ly.createElement('table'),
				tb = Ly.createElement('tbody'),
				otr;
			
			tr = tr || this.getHeader(table);
			otr = tr.cloneNode('true')
			tr.setAttribute('data-length', 2);

			tr.parentNode.insertBefore(otr, tr);
			
			// 将table的父节点position设置为relative，若值不为absolute时。
			table.parentNode.style.position = table.parentNode.style.position != 'position' ? 'relative' : 'position';
			
			table.parentNode.appendChild(nt);
			nt.appendChild(tb);
			tb.appendChild(tr);
			//tb.appendChild(otr);
			
			return this.copyAttributes(nt, table, ['className', 'border', 'cellSpacing', 'cellPadding']).fixTablePosition(nt, table);
		}
	};
};

Ly.FixedTableHeader.prototype = {
	/**
	 * 绑定到在构造函数时指定的Table上
	 * @param {Array} table 需要绑定的表格组成的数组
	 * table = [{
	 *     talbe : '要绑定的table对象',
	 *     target : '要固定的tr对象，若不存在则默认为table的第一个tr
	 * }]
	 */
	bind : function(tables) {
		var tables = tables || [],
			tr;
		
		for (var i = 0, len = tables.length; i < len; ++i) {
			if (!tables[i]) { continue; }
			this.method.createTable(tables[i].table, tables[i].target);
		}
		
		return this;
	}
};